

template <typename T>
char * Make_Headline (char * head_line, T * data_line, size_t size)
//Формування заголовку таблиці у стовбці
{
	*head_line= 0x00;
	const int dim_space = 256;
	char str_space[dim_space];
	int n_space=0;
	int colname_len;
	
	for (size_t i= 0; i< size; ++i)
	{
		colname_len = strlen(data_line[i].name);
		if ((colname_len+1)<= data_line[i].value)
		{
			strcat (head_line, data_line[i].name);
			n_space = data_line[i].value-colname_len;
			
			if (n_space >= dim_space) n_space = dim_space-1;
			for(int j= 0; j< n_space; ++j) str_space[j]=' ';
			str_space[n_space] = 0x00;

			strcat (head_line, str_space);
		}
		else
		{
			//Якщо назва стовбця більша за встановлену ширину
		}
	}
	return head_line;
}

char * Make_Cell (char * cell, char * field, size_t size)
//ФОрмування комірки таблиці у стовбець заданої ширини
{
	*cell = 0X00;
	//char * buf_str = new shar [size+1];
	const int dim_space = 256;
	char str_space[dim_space];
	int n_space=0;
	//int colname_len;
	
	int colname_len = strlen(field);
	strcat (cell, field);
	
	if ((colname_len+1)>= size)
	{
		//Обрізання частини рядка при відображенні, якщо він більший за встановлену ширину стовбця
		int st= size-3;
		cell[st++]=':';
		cell[st++]='>';
		cell[st++]=' ';
		cell[st++]=0x00;
	}
	n_space = size-colname_len;
		
	if (n_space >= dim_space) n_space = dim_space-1;
	for(int j= 0; j< n_space; ++j) str_space[j]=' ';
	
	str_space[n_space] = 0x00;
	strcat (cell, str_space);
	
	return cell;
}

template <typename T>
T ** Enter_Row (T ** film, int & capacity, int col)
//Введення нового запису у таблицю
{
	film = Add_Row(film, capacity, col);	//Функція розширення динамічної пам"яті
	
	cout << "\n";
	cout << "Name" << "\t\t: ";
	cin >> film[capacity][col-1].name;
	cout << "Producer" << "\t: ";
	cin >> film[capacity][col-1].producer;
	cout << "Genre" << "\t\t: ";
	cin >> film[capacity][col-1].genre;
	cout << "Rating" << "\t\t: ";
	cin >> film[capacity][col-1].rating;
	cout << "Price" << "\t\t: ";
	cin >> film[capacity][col-1].price;

	++capacity;
	return film;
}

template <typename T, typename R>
void Show_Filter (T head_data, R filter, bool set_filter/*=false*/)
//Відображення стану фільтра
{
	cout << "\n\n\t" << 	"FILTER  (logic 'AND')";
	cout << "\n\t" << 		"---------------------";
	
	cout << ((set_filter) ? "\n\t[n]: " : "\n\t");
	cout << head_data[1].name << "\t\t{ " << ((filter.name[0]==0x00) ?  "*" : filter.name) << " }";
	
	cout << ((set_filter) ? "\n\t[p]: " : "\n\t");
	cout << head_data[2].name << "\t{ " << ((filter.producer[0]==0x00) ?  "*" : filter.producer) << " }";
	
	cout << ((set_filter) ? "\n\t[g]: " : "\n\t");
	cout << head_data[3].name << "\t\t{ " << ((filter.genre[0]==0x00) ?  "*" : filter.genre) << " }";
	
	cout << ((set_filter) ? "\n\t[r]: " : "\n\t");
	cout << head_data[4].name << "\t\t{ ";
	((filter.rating==0) ? cout << "*" : cout << "<= " << filter.rating) << " }";
	
	cout << ((set_filter) ? "\n\t[c]: " : "\n\t");
	cout << head_data[5].name << "\t\t{ ";
	((filter.price==0) ? cout << "*" : cout << "<= " << filter.price) << " }";
	cout << "\n\t" << 		"---------------------" << "\n";

}

template <typename T, typename R>
void Show_Database(
					T ** film,
					T  filter,
					R * head_data,
					char * head_line,
					const int capacity,
					const int col,
					const int count_col
					)
{
//Виведення рядків бази даних з врахуванням стану фільтра
	
	int COL1 = head_data[0].value;
	int COL2 = head_data[1].value;
	int COL3 = head_data[2].value;
	int COL4 = head_data[3].value;
	int COL5 = head_data[4].value;
	int COL6 = head_data[5].value;

	cout << "\n\n" << Make_Headline(head_line, head_data, count_col);
	Line(strlen(head_line), '-');
	
	bool f_name;
	bool f_producer;
	bool f_genre;
	bool f_rating;
	bool f_price;
	
	for (int i= 0, n=1; i< capacity; ++i)
	{
		f_name = true;
		f_producer = true;
		f_genre = true;
		f_rating = true;
		f_price = true;
		
		if (filter.name[0] != 0x00) 		f_name = strstr(film[i][col-1].name, filter.name);
		if (filter.producer[0] != 0x00) 	f_producer = strstr(film[i][col-1].producer, filter.producer);
		if (filter.genre[0] != 0x00) 		f_genre = strstr(film[i][col-1].genre, filter.genre);
		if (filter.rating != 0) 			f_rating = (filter.rating >= film[i][col-1].rating);
		if (filter.price != 0) 				f_price = (filter.price >= film[i][col-1].price);
		
		if ((!f_name)||(!f_producer)||(!f_genre)||(!f_rating)||(!f_price)) continue;
		
/*		title table_field[]=
		{
			//pbuffer1, COL1,
			"n", COL1,
			*film[i][col-1].name, COL2,
			*film[i][col-1].producer, COL3,
			*film[i][col-1].genre, COL4,
			//itoa (film[i][col-1].rating, buffer2, 10), COL5,
			//itoa (film[i][col-1].price, buffer3, 10), COL6,
		};
*/		
		//char * tmp_cell = new char[len_view];
		char tmp_cell[256];
		char buf[8];

		cout << "\n";
		cout << Make_Cell (tmp_cell, itoa (n,buf,10), COL1);
		cout << Make_Cell (tmp_cell, film[i][col-1].name, COL2);
		cout << Make_Cell (tmp_cell, film[i][col-1].producer, COL3);
		cout << Make_Cell (tmp_cell, film[i][col-1].genre, COL4);
		cout << Make_Cell (tmp_cell, itoa(film[i][col-1].rating, buf,10), COL5);
		//cout << Make_Cell (tmp_cell, itoa(film[i][col-1].price, buffer, 10), COL6);
		cout << film[i][col-1].price;
		
		//delete [] tmp_cell;

		++n;
	}
}


